package atguigu.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

/**
 * @author alexzshl
 * @since 2018/12/13
 */
public class CodeGeneratorEduOther {

    // 2、全局配置
    // 项目（模块）路径，即 pom.xml 所在路径。可以使用内置变量 user.dir 或者直接使用绝对路径
    // public static final String PROJECT_PATH = "H:\\alex\\workspace\\IdeaProjects\\_atguigu\\my-guli-edu\\service\\service_edu";
    public static final String PROJECT_PATH = System.getProperty("user.dir");
    // author
    public static final String AUTHOR = "alexzshl";
    // 生成完毕是否打开目标文件夹
    public static final boolean GLOBAL_OPEN_EXPLORER_AFTER_GENERATED = false;
    // 是否覆盖
    public static final boolean GLOBAL_FILE_OVERRIDE = false;
    // 默认的 Service接口 模板为 "%sIService"
    public static final String GLOBAL_SERVICE_NAME_TEMPLATE = "%sService";
    // 主键策略
    public static final IdType GLOBAL_ID_TYPE = IdType.ID_WORKER_STR;
    // 日期类型
    public static final DateType GLOBAL_DATE_TYPE = DateType.ONLY_DATE;
    // 是否启用 swagger2。 影响生成的 entity 的 swagger 文档注释，例如：@ApiModel
    public static final boolean GLOBAL_SWAGGER_2 = true;

    // 3、数据源
    public static final String DATABASE_JDBC_URL = "jdbc:mysql://localhost:3306/guli_edu_std?serverTimezone=GMT%2B8";
    public static final String DATABASE_JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    public static final String DATABASE_JDBC_USERNAME = "root";
    public static final String DATABASE_JDBC_PASSWORD = "123";
    public static final DbType DATABASE_JDBC_DBTYPE = DbType.MYSQL;

    // 4、包配置
    public static final String PACKAGE_PARENT = "com.atguigu";
    public static final String PACKAGE_MODULE = "edu";
    public static final String PACKAGE_CONTROLLER = "controller";
    public static final String PACKAGE_ENTITY = "entity";
    public static final String PACKAGE_SERVICE = "service";
    public static final String PACKAGE_MAPPER = "mapper";

    // 5、策略配置
    // 要生成的数据库表
    public static final String[] STRATEGY_INCLUDE_TABLES = {
            "edu_teacher",
            "edu_subject",
            "edu_course",
            "edu_course_description",
            "edu_chapter",
            "edu_video"
    };

    /**
     * 请执行此单元测试方法生成代码（或者命名为 main 方法）
     */
    @Test
    public void run() {

        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = PROJECT_PATH;
        System.out.println(projectPath);
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor(AUTHOR);
        // 生成后是否打开资源管理器
        gc.setOpen(GLOBAL_OPEN_EXPLORER_AFTER_GENERATED);
        // 重新生成时文件是否覆盖
        gc.setFileOverride(GLOBAL_FILE_OVERRIDE);
        // 去掉Service接口的首字母I UserService
        gc.setServiceName(GLOBAL_SERVICE_NAME_TEMPLATE);
        // 主键策略
        gc.setIdType(GLOBAL_ID_TYPE);
        // 定义生成的实体类中日期类型
        gc.setDateType(GLOBAL_DATE_TYPE);
        // 开启Swagger2模式
        gc.setSwagger2(GLOBAL_SWAGGER_2);
        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(DATABASE_JDBC_URL);
        dsc.setDriverName(DATABASE_JDBC_DRIVER);
        dsc.setUsername(DATABASE_JDBC_USERNAME);
        dsc.setPassword(DATABASE_JDBC_PASSWORD);
        dsc.setDbType(DATABASE_JDBC_DBTYPE);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(PACKAGE_PARENT);
        pc.setModuleName(PACKAGE_MODULE);
        pc.setController(PACKAGE_CONTROLLER);
        pc.setEntity(PACKAGE_ENTITY);
        pc.setService(PACKAGE_SERVICE);
        pc.setMapper(PACKAGE_MAPPER);
        mpg.setPackageInfo(pc);

        // 自定义配置
        // 模块引擎（默认为 velocity）
        // mpg.setTemplateEngine(new VelocityTemplateEngine());
        // mpg.setTemplateEngine(new FreemarkerTemplateEngine());

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 要生成的数据库表
        strategy.setInclude(STRATEGY_INCLUDE_TABLES);
        // 数据库表映射到实体的命名策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 数据库表字段映射到实体的命名策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 生成实体时去掉表前缀
        // strategy.setTablePrefix(pc.getModuleName() + "_");
        // lombok 模型 @Accessors(chain = true) setter链式操作
        strategy.setEntityLombokModel(true);
        // restful api风格控制器
        strategy.setRestControllerStyle(true);
        // url中驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);

        // 6、执行
        mpg.execute();
    }
}
